home *** CD-ROM | disk | FTP | other *** search
- /*
- * IndexMixin abstract class
- *
- * a general class mixin which maintains a sequenceable list of
- * all the class's instances.
- *
- * Copyright © John Wainwright 1988
- *
- * MetaClass :
- *
- * SuperClasses :
- *
- * Class Vars :
- *
- * instanceList - head of the instance list
- *
- * Methods :
- *
- * new - new demon to build the instance list
- *
- * Class Methods :
- *
- * sequence obj - returns an sequence object for the instance list
- * allInstances - returns a List of all the instances
- * deepInstances - returns a List of all specialised instances
- */
-
- #include "oic.h"
- #include "generics.h"
-
- class IndexMixin; /* the IndexMixin class */
-
- struct indexMixin_c /* IndexMixin class var structure */
- {
- object imc_head; /* head of the instance list */
- int imc_count; /* how many in list */
- };
- typedef struct indexMixin_c indexMixin_c;
-
- struct indexMixin_i /* IndexMixin instance structure */
- {
- object im_next;
- };
- typedef struct indexMixin_i indexMixin_i;
-
- /* -------------------- IndexMixin Instance methods ---------------------------- */
-
- static object
- _new(self, im, argp)
- object self;
- register indexMixin_i *im;
- object *argp;
- {
- register indexMixin_c *imc;
-
- imc = localCVs(self, indexMixin_c);
- im->im_next = imc->imc_head;
- imc->imc_head = self;
- imc->imc_count += 1;
-
- return self;
- }
-
- /* -------------------- IndexMixin Class methods ---------------------------- */
-
- static object
- _sequence(class, cv)
- class class;
- indexMixin_c *cv;
- {
- return start(New(Linkseq), allInstances(class));
- }
-
- static object
- _allInstances(class, cv)
- class class;
- indexMixin_c *cv;
- {
- register object list;
- register object c;
-
- list = New(List, END);
- for (c = cv->imc_head; c != END; c = localIVs(c, indexMixin_i)->im_next)
- push(list, c);
-
- return list;
- }
-
- static object
- _deepInstances(class)
- class class;
- {
- register object list;
- register object seq;
- register object c;
-
- list = allInstances(class);
- for (seq = sequence(subs(class)); c = next(seq); )
- join(list, allInstances(c));
- dispose(seq);
- return list;
- }
-
- /* ------------------- Init the IndexMixin class ------------------------------- */
-
- _InitIndexMixin()
- {
- IndexMixin = NewClass(sizeof(indexMixin_i), sizeof(indexMixin_c),
- "IndexMixin", END);
- AddMethods(IndexMixin,
- newGeneric, _new,
- END);
-
- AddClassMethods(IndexMixin,
- allInstancesGeneric, _allInstances,
- deepInstancesGeneric, _deepInstances,
- sequenceGeneric, _sequence,
- END);
- }
-
-